Cteni ze serioveho portu

Otázka od: Viktor Marek

11. 7. 2004 14:19

Zdravim

Ze serioveho portu na kterem je pripojeno zarizeni vycitam hodnoty pomoci
komponenty AsyncFree.
Na Formu mam AfComPort1 a AfTerminal1 ve kterem se mi prubezne zobrazuji
ctene hodnoty ve tvaru:

1;x;xxxx;xxx;xxx;xxxx
2;x;xxxx;xxx;xxx;xxxx
3;x;xxxx;xxx;xxx;xxxx
4;x;xxxx;xxx;xxx;xxxx
1;x;xxxx;xxx;xxx;xxxx
2;x;xxxx;xxx;xxx;xxxx
3;x;xxxx;xxx;xxx;xxxx
4;x;xxxx;xxx;xxx;xxxx
.
.
kde x jsou jednotlive hodnoty

procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
begin
  cti:=AfComPort1.ReadString;
  AfTerminal1.WriteString(AfComPort1.ReadString);
end;

Jak dostat jednotlive radky do promene, abych je mohlo rozparsovat a hodnoty
zobrazovat treba v Labelu.

Diky za radu

Viktor Marek
viktor@vol.cz



Odpovedá: Jan Novak

11. 7. 2004 22:26

> cti:=AfComPort1.ReadString;
> AfTerminal1.WriteString(AfComPort1.ReadString);

Bozemuj! Kdyz to jednou vyctes do promenne 'cti', tak do terminalu uz
nebude co vzit, leda by mezitim prisel dalsi byte.

> Jak dostat jednotlive radky do promene

cti := cti + AfComPort1.ReadString;
repeat // vyhledame cele radky
 begin
 n := Pos(#13, cti); // prvni konec radku zleva
 if n>0 then
  begin
    radek := Copy(cti,1,n-1); // extrahujeme prvni radek
    cti := Copy(cti, n+1, Length(cti)); // usekneme zacatek 'cti'
    Zpracuj(radek);
  end;
 end until n=0; // opakujem, dokud tam nejaky CR byl

To 'cti' samozrejme nesmi byt lokalni v OnDataRecived. Ja jeste po
prijeti kazdeho byte nakopavam timer, resp nastavim do nejakeho
pocitadla pocet ms do timeoutu a pri OnTimer jej snizuju o
Timer.Interval, po vyprseni ten zbytek v 'cti' zkusim taky zpracovat
anebo jej alespon zrusim.

V tom zpracovani se vyhni Application.ProcessMessages, jinak hrozi
rekurzivni zavolani a nevim, nevim, jako by ta promenna 'cti'
dopadla...